package 回溯;

import java.util.ArrayList;
import java.util.List;
/**
 * 这个题 ， 又 提供 一些 其他的思考 ！ ，有些值 是不参与 ， 选择的 ！
 * 比如这一题中的  ， 对于 数字 情况是没有分支情况的。这个题确实提供了一些 新的思考 ！  
 * 这个题属于 比较另类的  一种！
 */
public class leetcode784字母大小写全排列 {



    // 2023/1/31 更新！



    public void recursion(int index,String s,List<String> ans, StringBuilder sb){
        if(index == s.length()){
            ans.add(sb.toString());
            return ;
        }
        char ch = s.charAt(index);
        // no change
        sb.append(ch);
        recursion(index + 1,s,ans,sb);
        sb.deleteCharAt(sb.length() - 1);
        // change if is digit 就不能 change
        if(isDigit(ch)){
            return ;
        }
        if(ch >= 'a'){
            recursion(index + 1,s,ans,sb.append((char)(ch - 32)));
        }
        else{
            recursion(index + 1,s,ans,sb.append((char)(ch + 32))) ;
        }
        sb.deleteCharAt(sb.length() - 1);
    }
    public boolean isDigit(char ch){
        if(ch >= '0' && ch <= '9'){
            return true;
        }
        return false;
    }




//=====================================================


	public static void main(String []args) {
//		char [] str = {'1'};
//		String s = str.toString();
//		System.out.println(str[0]);
//		System.out.println('z' - 'Z');
//		System.out.println(new String (str));
		
		String s = "AC";
		System.out.println(new leetcode784字母大小写全排列().letterCasePermutation(s));
		
	}
	
	
    public List<String> letterCasePermutation(String s) {
        List<String> ans = new ArrayList<>();
         char str [] = s.toCharArray();
         process(0,ans,str.length,str);
         return  ans;
     }
    
    
    /**
     * 多叉树的 版本 回溯
     */
    
    public void processOne(int index,List<String> ans,int len,char str[]) {
    	if(index == len) {
//    		System.out.println(index);
    		ans.add(new String(str));
    		return ;
    	}
    	for(int i = index;i < len;i++ ) {
    		if(judge(str[i]) == 1) {
    			 str[i] = (char) (str[i] - 32);
    			 processOne(i + 1,ans,len,str);
                 str[i] = (char) (str[i] + 32);
    		}
    		else if(judge(str[i]) == 2) {
    			 str[i] = (char) (str[i] + 32);
    			 processOne(i + 1,ans,len,str);
    	         str[i] = (char) (str[i] - 32);
    		}
    		else {
    			processOne(i + 1,ans,len,str);
    			break;
    		}
    		
    	}
    }
    /**
     * 二叉树的 版本！
     */
     public void process(int index,List<String> ans,int len,char[] str){
         if(index == len)
         ans.add(str.toString());
         // 当前 字符不变 直接跳过
         process(index + 1,ans,len,str);
         // 如果当前字符是 字母 ，则 转化进入下一层
         if(judge(str[index]) == 1){
             str[index] = (char) (str[index] - 32);
             process(index + 1,ans,len,str);
             str[index] = (char) (str[index] + 32);
         }
         else if(judge(str[index]) == 2){
              str[index] = (char) (str[index] + 32);
             process(index + 1,ans,len,str);
             str[index] = (char) (str[index] - 32);
         }
         
     }

     public int judge(char c){
         if(c <= '9' && c >= '0')
             return 0;
         if(c <= 'z' && c >= 'a')
             return 1;
         return 2;
     }

}
